242. 有效的字母异位词

242. 有效的字母异位词

题目链接
代码随想录

分析

其实字母异位词匹配这种问题我们在 76. 最小覆盖子串 就学习过怎么处理,在那个题中,以字符的 ASCII 码作为哈希函数映射到数组的索引,然后哈希结果就是一个长度为 128 的 int 数组,然后字符出现一次,就在对数组相应位置的 int 值 +1 即可,即 key 为字符,value 为字符出现的次数。
这个题,规定了字符中只有小写字母,哈希的结果数组只要 26 个字母即可。
这个题的具体思路就是,首先对比两个字符串的长度,不相同的话直接返回 false,然后过一遍源字符串,把字符出现的次数记下来,数组为 A,然后再过一遍目的字符串,过一个字符,就将 A 中相应字符的数量 -1,最周查看数组 A,有不为 0 的,就表示两个字符串不相等,全都为 0,则表示两个字符串的所有字符出现的次数都相等。

解题

public boolean isAnagram(String s, String t) {
    // 不需要记住 a 的 ASCII 码,直接用a计算即可
    int  offset = (int)'a';
    // 题目提示了是小写字母,因此 26 个就够用了
    int[] charCount = new int[26];
    char[] sourceCharArr = s.toCharArray();
    char[] targetCharArr = t.toCharArray();
    // 如果长度不相等,可以直接返回false
    if(targetCharArr.length!=sourceCharArr.length){
        return false;
    }
    for(int i=0;i<sourceCharArr.length;i++){
        int ascIndex = (int)sourceCharArr[i];
        // 对原字符串中的字符进行计数
        charCount[ascIndex-offset]++;
    }
    for(int i=0;i<targetCharArr.length;i++){
        int ascIndex = (int)targetCharArr[i];
        // 目标字符串的字符出现一次,就在原字符串中的字符的累计数上减1
        charCount[ascIndex-offset]--;
    }
    for(int i=0;i<charCount.length;i++){
        // 如果某一个字符的最终计数>0,说明这个字符在原字符中出现的次数大于其在目标字符串中出现的次数
        // 如果某一个字符的最终计数<0,说明这个字符在原字符中出现的次数小于其在目标字符串中出现的次数
        // 如果某一个字符的最终计数=0,说明这个字符在原字符中出现的次数等于其在目标字符串中出现的次数
        if(charCount[i]!=0){
            return false;
        }
    }
    // 每一个字符的计数都是0,则表示 原字符串跟目的字符串的所有字符的个数都相等。
    return true;
}

相关题

其实我觉得这个题应该放到数组这个类别里面
用数组统计字符出现次数
76. 最小覆盖子串
383. 赎金信